 1.Apache Kylin 实战之流式构建
   
   实时数据更新是一种普遍的需求，快速分析变化趋势才能做出正确的决策。
   Kylin V1.6 发布了可扩展的 streaming cubing 功能，它利用 Hadoop 消费 Kafka 数
据的方式构建 cube。
   这种方式构建的Cube能满足分钟级的更新需求。
   步骤：项目 => 定义数据源(Kafka) => 定义Model => 定义Cube => Build Cube
=> 作业调度(频率高)
   1).准备数据源
   从Kafka消费消息，每条消息都需要包含：维度信息、度量信息、业务时间戳。
   每条消息的数据结构都应该相同，并且可以用同一个分析器将每条消息中的维度、度
量和时间戳信息提取出来。
   目前默认的分析器为：org.apache.kylin.source.kafka.TimedJsonStreamParser
   
   # 创建名为kylin_streaming_topic的topic，有三个分区
kafka-topics.sh --create --zookeeper linux121:2181/myKafka --replication-factor 1 
--partitions 3 --topic kylin_streaming_topic1

   # 使用工具，向以上topic每秒发送100条记录
kylin.sh org.apache.kylin.source.kafka.util.KafkaSampleProducer
--topic kylin_streaming_topic1 --broker linux121:9092,linux122:9092

   # 检查消息是否成功发送
kafka-console-consumer.sh --bootstrap-server
linux121:9092,linux122:9092 --topic kylin_streaming_topic1 --from-beginning

   json数据样例
{
	"country": "INDIA",
	"amount": 61.8908749389114,
	"qty": 6,
	"currency": "USD",
	"order_time": 1604976730796,
	"category": "ELECTRONIC",
	"device": "Andriod",
	"user": {
		"gender": "Female",
		"id": "d7454b73-e24e-2f28-513e-5ea3e03b082f",
		"first_name": "unknown",
		"age": 18
	}
}
   2).定义数据源
   Add Streaming Table
   定义Schema
   定义kafka信息
   
   3).定义Model
   Model Designer、Data Model、Dimensions、Measures、settings的操作
   4).定义Cube
   Cube Info、Dimensions、Measures、Refresh Setting、
   Advanced Setting
   将衍生时间维度设置为Hierarchy关系，减少非必要计算
   在Rowkey部分，将用户最频繁用作过滤的列、筛选性强的列放在Rowkey的开始位置
   Streaming Cube 和普通的 cube 大致上一样。以下几点需要注意：
       分区时间列应该是 Cube 的一个 dimension。在 Streaming OLAP 中时间总是
一个查询条件，Kylin 利用它来缩小扫描分区的范围
       不要使用 order_time 作为 dimension 因为它非常的精细；建议使用
mintue_start、hour_start 或其他，取决于用户如何查询数据 
       定义 year_start、quarter_start、month_start、day_start，hour_start，
minute_start 作为层级以减少组合计算
       在refersh setting 设置中,创建更多合并的范围,如0.5 小时、4 小时、1 天、
7 天;这样设置有助于控制 cube segment 的数量
       在 rowkeys 部分，拖拽 minute_start 到最上面的位置,对于 streaming 查询，
时间条件会一直显示；将其放到前面将会缩小扫描范围      
   5).Build Cube
   curl -X PUT --user ADMIN:KYLIN -H "Content-Type:
application/json;charset=utf-8" -d '{ "sourceOffsetStart": 0,
"sourceOffsetEnd": 9223372036854775807, "buildType": "BUILD"}'
http://linux122:7070/kylin/api/cubes/streaming_cude1/build2
   6).执行查询
select minute_start, count(*), sum(amount), sum(qty)
	from streamingds1
group by minute_start
order by minute_start
   7).自动Build
   第一个 Cube 构建和查询成功了，就可以按照一定的频率调度增量 build。Kylin 将会
记录每一个 build的offsets;当收到一个 build 请求,它将会从上一个结束的位置开始,
然后从 Kafka 获取最新的 offsets。有了 REST API 您可以使用任何像 Linux cron 
调度工具触发构建任务。

crontab -e
*/20 * * * * curl -X PUT --user ADMIN:KYLIN -H "Content-Type:
application/json;charset=utf-8" -d '{ "sourceOffsetStart": 0,
"sourceOffsetEnd": 9223372036854775807, "buildType": "BUILD"}'
http://linux122:7070/kylin/api/cubes/streaming_cude1/build2